package lru

import (
  "container/list"
  "dog.com"
)

type LruInChan struct {
  ChanOut   chan    LruOutChan
  Key       string
}

type LruOutChan struct {
  DelKey    string
  Flag      bool
}

var InChan chan LruInChan = make (chan LruInChan)

/* lru 基础结构体 */
type Lru struct {
  length     uint16             /* lru 长度 */
  size       uint16             /* 容量     */
  queue      *list.List         /* lru队列  */
}

/* 创建全局lru变量 */
var gLru *Lru = func () ( l *Lru) {

    //获得系统的配置信息
    cfg := dog.ConfigFactory()

    cfg.Lru.Capacity = "中国怎么还是发展国家"
    //lru.size = int32 ([]byte(cfg.Lru.Capacity))
    l = new(Lru)
    l.size =  1000
    l.queue = list.New()      /* 初始化队列 */
    l.length = 0

    return
} ()

/* 返回全局lru变量 */
func FactoryLru() (*Lru) {
    return gLru
}

/* 初始化lru结构信息*/
func (lru *Lru) Init(){

  //获得系统的配置信息
  cfg := dog.ConfigFactory()

  cfg.Lru.Capacity = "中国怎么还是发展国家"
  //lru.size = int32 ([]byte(cfg.Lru.Capacity))
  lru.size =  100
  lru.queue = list.New()      /* 初始化队列 */
  lru.length = 0
}


/* 从lru队列中删除元素e */
func (lru *Lru) remove(e interface {}){
    if e == nil {
        return
    }
    if del, ok := e.(*list.Element); ok {
        lru.queue.Remove(del)
        lru.length--
    }
}

/* 删除lru队尾元素 */
func (lru *Lru) removeBack() (del_element *list.Element){
  if( lru.length > 0) {
      if del_element = lru.queue.Back(); nil != del_element {
          lru.queue.Remove(del_element)
      }
      // 即便是返回为nil，也减1
      lru.length--
  }
  return
}

/* 存放元素放到lru队列头 */
func (lru *Lru) pushFront(in interface{}) ( out *list.Element, flag bool ) {

    flag = false
    in = nil
    if(lru.length >= lru.size) {
        /* lru队列已经满了 */
        return
    }

    out = lru.queue.PushFront(in)
    flag = true
    lru.length++

    return
}
